package com.example.multithread.practise.linkedlist;

import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
@Slf4j
public class Solution {
    public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
        if (headA.equals(headB)) {
            return headA;
        }
        ListNode aNext = headA;
        ListNode bNext = headB;
        List<ListNode> aList = new ArrayList<>();
        List<ListNode> bList = new ArrayList<>();

        while (aNext.next != null || bNext.next != null) {
            if (aNext.equals(bNext)) {
                return aNext;
            }
            if (aList.contains(bNext)) {
                return bNext;
            }
            if (bList.contains(aNext)) {
                return aNext;
            }
            if (aNext != null) {
                aList.add(aNext);
                if (aNext.next != null) {
                    aNext = aNext.next;
                }
            }
            if (bNext != null) {
                bList.add(bNext);
                if (bNext.next != null) {
                    bNext = bNext.next;
                }
            }
        }
        if (aList.contains(bNext)) {
            return bNext;
        }
        if (bList.contains(aNext)) {
            return aNext;
        }
        return null;
    }

    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
//        ListNode listNode2 = new ListNode(2);
//        ListNode listNode3 = new ListNode(3);
//        ListNode listNode4 = new ListNode(4);
//        listNode1.next = listNode2;
//        listNode2.next = listNode3;
//        listNode3.next = listNode4;


        ListNode listNode5 = new ListNode(5);
        ListNode listNode6 = new ListNode(6);
        ListNode listNode7 = new ListNode(7);
        ListNode listNode8 = new ListNode(8);

        listNode5.next = listNode1;
//        listNode6.next = listNode7;
//        listNode7.next = listNode8;
//        listNode8.next = listNode3;
        ListNode intersectionNode = getIntersectionNode(listNode1, listNode5);
        if (intersectionNode != null) {
            log.info(intersectionNode.toString());
        }
    }
}

@ToString
class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
        next = null;
    }
}